package com.carb.utils;

import cn.hutool.core.util.StrUtil;
import com.carb.constant.MessageConstant;
import com.carb.exception.RegexErrorException;

/**
 * 正则校验工具类
 */
public class RegexUtils {

    // 手机号正则
    public static final String MOBILE_PHONE_REGEX = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";

    // 身份证正则
    public static final String ID_NUMBER_REGEX = "^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";

    // 邮箱正则
    public static final String EMAIL_REGEX = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";

    // 密码正则。4~32位的字母、数字、下划线
    public static final String PASSWORD_REGEX = "^\\w{4,32}$";

    // 车牌号正则
    public static final String PLATE_NUMBER_REGEX = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$";

    // 评分(1-5)正则
    public static final String RATING_REGEX = "^[1-5]$";

    // 验证码正则, 6位数字或字母
    public static final String CAPTCHA_REGEX = "^[a-zA-Z\\d]{6}$";


    /**
     * 校验是否是无效手机格式（无效抛出异常）
     * @param mobilePhone 需要校验的移动电话
     */
    public static void checkMobilePhone(String mobilePhone){
        if (mismatch(mobilePhone, MOBILE_PHONE_REGEX)) {
            throw new RegexErrorException(MessageConstant.MOBILE_PHONE_FORMAT_ERROR);
        }
    }

    /**
     * 校验是否是无效身份证号格式
     * @param idNumber 需要校验的身份证号码
     */
    public static void checkIdNumber(String idNumber){
        if (mismatch(idNumber, ID_NUMBER_REGEX)) {
            throw new RegexErrorException(MessageConstant.ID_NUMBER_FORMAT_ERROR);
        }
    }

    /**
     * 校验是否是无效邮箱格式
     * @param email 需要校验的电子邮箱
     */
    public static void checkEmail(String email){
        if (mismatch(email, EMAIL_REGEX)) {
            throw new RegexErrorException(MessageConstant.EMAIL_FORMAT_ERROR);
        }
    }

    /**
     * 校验是否是无效密码格式
     * @param password 需要校验的密码
     */
    public static void checkPassword(String password){
        if (mismatch(password, PASSWORD_REGEX)) {
            throw new RegexErrorException(MessageConstant.PASSWORD_FORMAT_ERROR);
        }
    }

    /**
     * 校验是否是无效车牌号格式
     * @param plateNumber 需要校验的车牌号
     */
    public static void checkPlateNumber(String plateNumber){
        if (mismatch(plateNumber, PLATE_NUMBER_REGEX)) {
            throw new RegexErrorException(MessageConstant.PLATE_NUMBER_FORMAT_ERROR);
        }
    }

    /**
     * 校验是否是无效评分数值
     * @param rating 需要校验的评分
     */
    public static void checkRating(String rating){
        if (mismatch(rating, RATING_REGEX)) {
            throw new RegexErrorException(MessageConstant.RATING_FORMAT_ERROR);
        }
    }

    /**
     * 校验是否是无效验证码格式
     * @param code 需要校验的验证码
     */
    public static void checkCaptcha(String code){
        if (mismatch(code, CAPTCHA_REGEX)) {
            throw new RegexErrorException(MessageConstant.CAPTCHA_FORMAT_ERROR);
        }
    }

    /**
     * 校验是否不符合正则格式
     * @param str 需要校验的字符串
     * @param regex 正则表达式
     * @return true：无效，false：有效
     */
    private static boolean mismatch(String str, String regex){
        if (StrUtil.isBlank(str)) {
            return true;
        }
        return !str.matches(regex);
    }
}

